import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

// 每次进入网站时，获取本地存储中的car
var car = JSON.parse(localStorage.getItem('car') || '[]')

var store = new Vuex.Store({
    state: { //共享数据
        car: car
            // 将购物车中的商品数据，用一个数组存储起来，一个商品对应一个对象
            // {
            //     id: 商品ID,
            //     count: 商品购买数量,
            //     price: 商品价格,
            //     selected: 是否开启结算状态
            // }
    },
    mutations: { //通过里面的方法去改变 state 中的数据
        addCar(state, obj){ //添加购物车，保存到 state.car 中
            // 1.当购物车car中已经存在该商品，则更新数量即可
            // 2.没有该商品，则添加进去
            var ret = state.car.some(item => {
                if(item.id === obj.id){
                    item.count += parseInt(obj.count)
                    return true
                }
            })
            if(!ret){
                state.car.push(obj)
            }

            // 保存到本地存储中
            localStorage.setItem('car', JSON.stringify(state.car))
        },
        updateGoodsCount(state, obj){
            // 根据传递的商品对象id，修改商品的数量值，并保存到本地
            state.car.some(item => {
                if(item.id === obj.id){
                    item.count = obj.count
                    return true
                }
            })

            localStorage.setItem('car', JSON.stringify(state.car))
        },
        removeGoodsById(state, id){
            // 根据传递的商品id删除，将最新数据保存到本地
            var index = state.car.findIndex(item => item.id === id)
            state.car.splice(index, 1)

            localStorage.setItem('car', JSON.stringify(state.car))
        },
        updateGoodsSelected(state, obj){
            // 根据传递的商品对象id，修改是否选中状态
            state.car.some(item => {
                if(item.id === obj.id){
                    item.selected = obj.selected
                    return true
                }
            })

            localStorage.setItem('car', JSON.stringify(state.car))
        }
    },
    getters: { //相当于 计算属性或者filters
        sumCount(state) {
            var sum = 0
            state.car.forEach(item => {
                sum += item.count
            })
            return sum
        },

        // 把每一项的id作为属性名，数量作为键值
        getGoodsCount(state){
            var o = {}
            state.car.forEach(item => o[item.id] = item.count)
            return o
        },

        // 把每一项的id作为属性名，选中状态作为键值
        getGoodsSelected(state){
            var o = {}
            state.car.forEach(item => {
                o[item.id] = item.selected
            })
            return o
        },

        // 把每一项的id作为属性名，最大值作为键值
        getGoodsMax(state){
            var o = {}
            state.car.forEach(item => {
                o[item.id] = item.max
            })
            return o
        }
    }
})

export default store
